// 切换医院时在SOCKET这里修改ws地址
const SOCKET = `wss://${domain}/websocket`

if ("".trim === undefined) {
    String.prototype.trim = function () {
        return this.replace(/(^\s*)|(\s*$)/g, "");
    }
    String.prototype.ltrim = function () {
        return this.replace(/(^\s*)/g, "");
    }
    String.prototype.rtrim = function () {
        return this.replace(/(\s*$)/g, "");
    }
}

/**
 * 定义问诊中收发的数据包类型
 * @type {{logout: number, addPatientQueue: number, joinRoom: number, msgResponse: number, login: number, msgRequest: number, patientQueueList: number}}
 */
var dataType = {
    login: 1,							// 登陆请求
    logout: 2,							// 登出请求
    msgRequest: 3,						// 发送信息
    msgResponse: 4,						//[接收] 收到消息
    addPatientQueue: 5,					//[患者端发送]申请问诊排队
    patientQueueList: 6,				//[接收]【患者】问诊中排队的患者列表
    joinRoomRequest: 7,					//[接收]医生[接诊]：请求患者进入问诊房间
    msgCenter: 8,						//[接收]首页-消息中心需要刷新
    otherLeaveRoomRequest: 9,			//[接收]对方已离线
    doctorAccess: 10,					//医生端点击 接诊
    cancelPatientQueue: 11,				//患者端点击 取消排队
    reFlashList: 12,					//[接收]刷新医生列表
    patientEnd: 13,						//医生与患者通用 点击 结束问诊
    patientEndMsg: 14,					//[接收]医生与患者通用-本次问诊结束
    doctorShare: 15,					//医生点击 分诊 收到广播表明申请成功@16
    doctorShareSuccess: 16,				//[接收]医生点击分诊患者成功后的广播 医生与患者共同响应
    doctorChangeInfo: 17,				//[接收]医生修改问诊信息-病历部分的广播
    doctorChangeSuggestions: 18,		//[接收]医生修改问诊信息-住院建议的广播
    PatientChangeMeasuredData: 19,		//患者修改了测量数据
    historyRequest: 20,					//聊天室请求历史消息
    historyResponse: 21,				//[接收]聊天室返回历史消息
    noChatType: 22,						//[接收]问诊方式与接诊方式不一致
    oneMinNoConnect: 23,				//[接收]一分钟内医生未重新连接
    fiveMinWait: 24,					//[患者端发送]继续等待医生5分钟
    doctorReConnectFail: 25,			//[接收]医生拒绝重连
    doctorReConnect: 26,				//[医生端发送]医生重连
    fiveMinWaitFail: 27,				//[接收]患者等待5分钟后医生未重连
    // 更多事件码没有列举完……
};
var wsConnection = {
    heartbeatTime: 8000,  // 心跳时间
    wsUrl: "",
    token: "",
    ws: {},
    intervalId: 0,  // 心跳定时器id
    lock: false,
    initWebSocket: function (wsUrl, token) {
        if (wsUrl) {
            this.wsUrl = wsUrl;
        }
        if (token) {
            this.token = token;
        }
        var that = this;
        this.ws = new WebSocket(this.wsUrl);
        this.ws.onopen = this.onOpen.bind(this);
        this.ws.onmessage = function (event) {
            if (typeof event.data === 'object') {
                var reader = new FileReader();
                reader.onload = function (event) {
                    var content = reader.result.trim();
                    if (content.indexOf("{") === 0) {
                        content = JSON.parse(content);
                        that.onMessage(content);
                    }

                };
                reader.readAsText(event.data);
            }
        };
        this.ws.onclose = this.onClose.bind(this);
        this.ws.onerror = this.onError.bind(this);
    },
    onOpen: function (event) {
        this.login();
        this.resetHeartbeat();
    },
    onMessage: function (msg) {
        console.log(msg);
    },
    onClose: function (evt) {
        console.log("Connection closed.");
        if (evt.code !== 1000) {
            this.reconnect();
        }
    },
    onError: function (ev) {
        this.reconnect();
    },
    login: function () {
        // 进行登录认证
        this.send(dataType.login, { token: this.token });
    },
    reconnect: function () {
        if (this.lock) {
            return;
        }
        this.lock = true;
        var that = this;
        this.intervalId = setTimeout(function () {
            that.initWebSocket();
            that.lock = false;
        }, 3000);
    },
    startWsHeartbeat: function () {
        var that = this;
        this.intervalId = setInterval(function () {
            //判断websocket当前状态
            // 0 ：对应常量 正在建立连接连接，还没有完成。
            // 1 ：对应常量OPEN   连接成功建立，可以进行通信。
            // 2 ：对应常量CLOSING  连接正在进行关闭握手，即将关闭。
            // 3 : 对应常量CLOSED  连接已经关闭或者根本没有建立。
            if (that.ws.readyState === 1) {
                that.ws.send("ping"); // 心跳包
            } else if (3 === that.ws.readyState) {
                that.reconnect();
            }
        }, this.heartbeatTime);
    },
    resetHeartbeat: function () {
        this.intervalId > 0 && clearInterval(this.intervalId);
        this.startWsHeartbeat()
    },
    /**
     *
     * @param type 信息包类型
     * @param data 发送的需要发送的数据
     */
    send: function (type, data) {
        if (!data) {
            data = {};
        }
        data.packageType = type;
        if (this.ws.readyState !== 1) {
            console.log('链接状态=' + this.ws.readyState + '不可发送消息 ');
            return;
        }
        data = JSON.stringify(data);
        this.ws.send(data);
        // this.ws.send(new Blob([data], {type: "text/plain;charset=utf-8"}));
    }
};

//初始化webscoket
// function initWebSocket() {
// 连接socket 重构的聊天要用到socket
var token = null;
var userJson = localStorage.getItem('DSXBuserJson');
if (userJson) {
    user_id = strToJson(userJson).id
    token = strToJson(userJson).h5Token

    // 连接socket
    wsConnection.initWebSocket(SOCKET, token);
}

// }


// =============================================== 以下为测试代码 ===============================================

// var wsUrl = "ws://" + location.hostname + ":8506/websocket";
// // 登录的token
// // 这个是患者或医生的IM主键，医生->患者IM ，患者->医生IM
// var friendId = 12;
// // 从URL 中读取参数进行数据初始化
// var param = getRequestQuery();
// restParam();
// // 可以重写方法
// wsConnection.onMessage = function (msg) {
//     // todo 判断数据包类型进行后续处理 dataType
//     console.log(msg);
//     var info = document.getElementById('log');
//     info.innerHTML = info.innerHTML + JSON.stringify(msg) + '<br/>';
// };
// // 初始化链接
// wsConnection.initWebSocket(wsUrl, param.token);



// /**
//  * 模拟发送聊天信息 输入框的文本
//  */
// function sendMsg() {
//     var msg = document.getElementById('msg').value;
//     wsConnection.send(dataType.msgRequest, {
//         "msgText": msg,
//         "friendId": friendId,
//         "msgType": 0,
//         "msgDate": formatDate(new Date())
//     });
// }

// /**
//  * 模拟加入排队中
//  * @returns {Blob}
//  */
// function addPatientQueue() {

//     wsConnection.send(dataType.addPatientQueue, {
//         logId: 212, // 本次问诊的id
//         doctorImId: 10 // 医生id
//     }) ;
// }


// function restParam() {
//     param = getRequestQuery();
//     if (param.friendId) {
//         friendId = param.friendId;
//     }
//     if (param.token) {
//         token = param.token;
//     }
// }

// /**
//  *
//  * @param date
//  * @param format
//  * @returns {string}
//  */
// function formatDate(date, format) {
//     if (format === undefined) {
//         format = 'YY-MM-DD hh:mm:ss';
//     }

//     var year = date.getFullYear(),
//         month = date.getMonth() + 1,//月份是从0开始的
//         day = date.getDate(),
//         hour = date.getHours(),
//         min = date.getMinutes(),
//         sec = date.getSeconds();
//     var preArr = Array.apply(null, Array(10)).map(function (elem, index) {
//         return '0' + index;
//     });
//     var newTime = format.replace(/YY/g, year)
//         .replace(/MM/g, preArr[month] || month)
//         .replace(/DD/g, preArr[day] || day)
//         .replace(/hh/g, preArr[hour] || hour)
//         .replace(/mm/g, preArr[min] || min)
//         .replace(/ss/g, preArr[sec] || sec);

//     return newTime;
// }

// /**
//  * 测试方法需要- 由URL中获取参数
//  * @constructor
//  */
// function getRequestQuery() {
//     var obj = {};
//     var url = location.search; //获取url中"?"符后的字串
//     if (url.indexOf("?") !== -1) {    //判断是否有参数
//         var str = url.substr(1); //从第一个字符开始 因为第0个是?号 获取所有除问号的所有符串
//         strs = str.split("&");
//         if (strs.length > 1) {
//             strs.forEach(function (v) {
//                 var a = v.split('=');
//                 obj[a[0]] = a[1];
//             });
//         }
//     }
//     return obj;
// }

